home *** CD-ROM | disk | FTP | other *** search
- /*
- File: CompositeDriverDescription.c
-
- Contains: Composite Class Driver Definition Header
-
- Version: xxx put version here xxx
-
- Copyright: © 1997-1999 by Apple Computer, Inc., all rights reserved.
-
- */
-
- #include <Types.h>
- #include <Devices.h>
- #include <DriverServices.h>
- #include <USB.h>
-
-
- #include "CompositeClassDriver.h"
- #include "CompositeClassVersion.h"
-
- usbCompositePBStruct newInterfacesPB;
-
-
- OSStatus CompositeDriverInitInterface(
- UInt32 interfaceNum,
- USBInterfaceDescriptor *interfaceDesc,
- USBDeviceDescriptor *deviceDesc,
- USBDeviceRef device);
-
- //------------------------------------------------------
- //
- // This is the driver description structure that the expert looks for first.
- // If it's here, the information within is used to match the driver
- // to the device whose descriptor was passed to the expert.
- // Information in this block is also used by the expert when an
- // entry is created in the Name Registry.
- //
- //------------------------------------------------------
- USBDriverDescription TheUSBDriverDescription =
- {
- // Signature info
- kTheUSBDriverDescriptionSignature,
- kInitialUSBDriverDescriptor,
-
- // Device Info
- 0, // vendor = not device specific
- 0, // product = not device specific
- 0, // version of product = not device specific
- 0, // protocol = not device specific
-
- // Interface Info (* I don't think this would always be required...*)
- 0, // Configuration Value
- 0, // Interface Number
- 0, // Interface Class
- 0, // Interface SubClass
- 0, // Interface Protocol
-
-
- // Driver Info
- "\pUSBCompositeDevice"kCMPStringVersShort, // Driver name for Name Registry
- kUSBCompositeClass, // Device Class (from USBDeviceDefines.h)
- kUSBCompositeSubClass, // Device Subclass
- kCMPHexMajorVers,
- kCMPHexMinorVers,
- kCMPCurrentRelease,
- kCMPReleaseStage, // version of driver
-
- // Driver Loading Info
- kUSBDoNotMatchInterface // Please don't load us as an interface driver.
- };
-
- USBClassDriverPluginDispatchTable TheClassDriverPluginDispatchTable =
- {
- kClassDriverPluginVersion, // Version of this structure
- CompositeDriverValidateHW, // Hardware Validation Procedure
- CompositeDriverInitialize, // Initialization Procedure
- CompositeDriverInitInterface, // Interface Initialization Procedure
- CompositeDriverFinalize, // Finalization Procedure
- CompositeDriverNotifyProc // Driver Notification Procedure
- };
-
- // hubDriverInitInterface function
- // Called to initialize driver for an individual interface - either by expert or
- // internally by driver
- OSStatus CompositeDriverInitInterface(
- UInt32 interfaceNum,
- USBInterfaceDescriptor *interfaceDesc,
- USBDeviceDescriptor *deviceDesc,
- USBDeviceRef device)
- {
- #pragma unused (interfaceNum)
- #pragma unused (interfaceDesc)
- #pragma unused (deviceDesc)
- #pragma unused (device)
-
- return (OSStatus)kUSBNoErr;
- }
-
- OSStatus CompositeDriverNotifyProc(UInt32 notification, void *pointer, UInt32 refcon)
- {
- #pragma unused (pointer)
- #pragma unused (refcon)
-
- OSStatus myErr;
- OSStatus status = kUSBNoErr;
- UInt32 count = 0;
- static UInt32 interfacenum = 0;
-
- switch (notification)
- {
- case kNotifyExpertTerminating: // TCC <USB15>
- newInterfacesPB.expertTerminatePending = true;
- while (count < newInterfacesPB.interfaceCount)
- USBExpertRemoveInterfaceDriver(newInterfacesPB.interfaceRefArray[count++]);
- return(noErr);
- break;
- case kNotifyDriverBeingRemoved:
- newInterfacesPB.driverRemovalPending = true;
-
- if (newInterfacesPB.pb.usbRefcon & kCompletionPending)
- {
- USBExpertStatus(newInterfacesPB.deviceRef, kCompositeDriverName": Waiting for transaction to complete", newInterfacesPB.pb.usbRefcon);
- status = kUSBDeviceBusy;
- }
- else
- {
- if (interfacenum == 0)
- newInterfacesPB.pb.usbStatus = kUSBNoErr;
-
- if (newInterfacesPB.pb.usbStatus == kUSBPending)
- {
- USBExpertStatus(newInterfacesPB.deviceRef, kCompositeDriverName": Waiting for Dispose/Deallocate to complete", newInterfacesPB.pb.usbRefcon);
- status = kUSBDeviceBusy;
- }
- else
- {
- if (interfacenum < newInterfacesPB.interfaceCount)
- {
- USBExpertRemoveInterfaceDriver(newInterfacesPB.interfaceRefArray[interfacenum]);
- InitParamBlock(newInterfacesPB.interfaceRefArray[interfacenum], &newInterfacesPB.pb);
- newInterfacesPB.pb.usbRefcon = 0;
- newInterfacesPB.pb.usbCompletion = (USBCompletion)kUSBNoCallBack;
- myErr = USBDisposeInterfaceRef(&newInterfacesPB.pb);
- if(immediateError(myErr))
- {
- USBExpertFatalError(newInterfacesPB.interfaceRefArray[interfacenum], kUSBInternalErr, kCompositeDriverName" - USBDisposeInterfaceRef - immediate error", myErr);
- }
- interfacenum++;
- status = kUSBDeviceBusy;
- }
- else
- {
- if (newInterfacesPB.pFullConfigDescriptor)
- {
- InitParamBlock(newInterfacesPB.deviceRef, &newInterfacesPB.pb);
- newInterfacesPB.pb.usbRefcon = 0;
- newInterfacesPB.pb.usbBuffer = newInterfacesPB.pFullConfigDescriptor;
- newInterfacesPB.pb.usbCompletion = (USBCompletion)kUSBNoCallBack;
- myErr = USBDeallocMem(&newInterfacesPB.pb);
- newInterfacesPB.pFullConfigDescriptor = nil;
- status = kUSBDeviceBusy;
- }
- else
- {
- status = kUSBNoErr;
- }
- }
- }
- }
- break;
-
- default:
- break;
- }
- return status;
- }
-
- // Hardware Validation
- // Called upon load by Expert
- OSStatus CompositeDriverValidateHW(USBDeviceRef device, USBDeviceDescriptor *desc)
- {
- #pragma unused (device)
- #pragma unused (desc)
-
- return (OSStatus)kUSBNoErr;
- }
-
- // Initialization function
- // Called upon load by Expert
- OSStatus CompositeDriverInitialize (USBDeviceRef device, USBDeviceDescriptorPtr pDesc, UInt32 busPowerAvailable)
- {
- // don't let a race condition occur; prevent finalizing until we're all done.
- DeviceInitialize(device, pDesc, busPowerAvailable);
- return (OSStatus)kUSBNoErr;
- }
-
- // Termination function
- // Called by Expert when driver is being shut down
- OSStatus CompositeDriverFinalize(USBDeviceRef theDeviceRef, USBDeviceDescriptorPtr pDesc)
- {
- #pragma unused (pDesc)
-
- USBExpertStatus(theDeviceRef, kCompositeDriverName" - Finalize", 0);
- return (OSStatus)kUSBNoErr;
- }
-
- void DeviceInitialize(USBDeviceRef device, USBDeviceDescriptorPtr pDeviceDescriptor, UInt32 busPowerAvailable)
- {
- static Boolean beenThereDoneThat = false;
-
- if(beenThereDoneThat)
- {
- USBExpertFatalError(device, kUSBInternalErr, kCompositeDriverName" is not reentrant!", 0);
- return;
- }
- beenThereDoneThat = true;
-
- newInterfacesPB.driverRemovalPending = false;
- newInterfacesPB.expertTerminatePending = false;
-
- newInterfacesPB.deviceRef = device;
- newInterfacesPB.deviceDescriptor = *pDeviceDescriptor;
-
- newInterfacesPB.busPowerAvailable = busPowerAvailable;
- newInterfacesPB.delayLevel = 0;
- newInterfacesPB.transDepth = 0;
- newInterfacesPB.retryCount = kCompositeRetryCount;
- newInterfacesPB.pFullConfigDescriptor = nil;
-
- InitParamBlock(device, &newInterfacesPB.pb);
- newInterfacesPB.pb.usbRefcon = kGetFullConfiguration0; /* Start out at first state */
-
- // DebugStr("\pIn Composite Driver");
- CompositeDeviceInitiateTransaction(&newInterfacesPB.pb);
- }
-
-
-